This is a fix for some device model corner cases including:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 4 Nov 2005 10:08:45 +0000 (11:08 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 4 Nov 2005 10:08:45 +0000 (11:08 +0100)
 1: mistake sequence of set/clr to virtual IRQ line.
 2: wrong sequence of IRQ request clear
 3: Add one more place to enable_irq_window.

Signed-off-by: Eddie Dong <eddie.dong@intel.com>
tools/ioemu/hw/i8259_stub.c
xen/arch/x86/dm/i8259.c
xen/arch/x86/vmx_io.c

index 2315184e9e91d8c710771480589a4df6117d8829..d0cfa1e4c61ee118785825af5602bacfbe637dd2 100644 (file)
@@ -55,13 +55,13 @@ void pic_set_irq(int irq, int level)
     if ( gio->pic_elcr & mask ) {
         /* level */
        if ( level ) {
-           atomic_set_bit(irq, &gio->pic_irr);
            atomic_clear_bit(irq, &gio->pic_clear_irr);
+           atomic_set_bit(irq, &gio->pic_irr);
            global_env->send_event = 1;
        }
        else {
-           atomic_set_bit(irq, &gio->pic_clear_irr);
            atomic_clear_bit(irq, &gio->pic_irr);
+           atomic_set_bit(irq, &gio->pic_clear_irr);
            global_env->send_event = 1;
        }
     }
index efb5e693c6e72e98cafea2b4f7c22f39115cd553..ed3ffc8eafef06185d4f4274184cdaf93fccfbf2 100644 (file)
@@ -512,10 +512,10 @@ int cpu_get_pic_interrupt(struct vcpu *v, int *type)
     if ( !plat->interrupt_request )
         return -1;
 
+    plat->interrupt_request = 0;
     /* read the irq from the PIC */
     intno = pic_read_irq(s);
     *type = VLAPIC_DELIV_MODE_EXT;
-    plat->interrupt_request = 0;
     return intno;
 }
 
index df3c36513dc8e148392889e47b119b45e155483b..33d4c7290c73acfdb512be0f0ffb59fd6f1d25aa 100644 (file)
@@ -881,6 +881,7 @@ asmlinkage void vmx_intr_assist(void)
     __vmread(VM_ENTRY_INTR_INFO_FIELD, &intr_fields);
 
     if (intr_fields & INTR_INFO_VALID_MASK) {
+        enable_irq_window(cpu_exec_control);
         VMX_DBG_LOG(DBG_LEVEL_1, "vmx_intr_assist: intr_fields: %lx",
                     intr_fields);
         return;